package com.tupu.util;

import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.regex.Pattern;

/**
 * 正则匹配工具类
 */
@Slf4j
@Component
public final class RegexUtil {

    /**
     * 匹配首个捕获组
     *
     * @param text  匹配字符串
     * @param regex 正则表达式
     * @return 匹配结果
     */
    public static String matchFirst(String text, String regex) {
        if (Objects.isNull(text)) {
            return "";
        }
        val p = Pattern.compile(regex);
        val m = p.matcher(text);
        if (m.find()) {
            return m.group();
        }
        return "";
    }

    /**
     * 匹配首个捕获组并去除首位空白字符
     *
     * @param text  匹配字符串
     * @param regex 正则表达式
     * @return 匹配结果
     */
    public static String matchFirstTrim(String text, String regex) {
        if (Objects.isNull(text)) {
            return "";
        }
        val p = Pattern.compile(regex);
        val m = p.matcher(text);
        if (m.find()) {
            return m.group().trim();
        }
        return "";
    }

    /**
     * 匹配全部捕获组
     *
     * @param text  匹配字符串
     * @param regex 正则表达式
     * @return 匹配结果
     */
    public static List<String> matchAll(String text, String regex) {
        if (Objects.isNull(text)) {
            return new ArrayList<>();
        }
        val list = new LinkedList<String>();
        val p = Pattern.compile(regex);
        val m = p.matcher(text);
        while (m.find()) {
            list.add(m.group());
        }
        return list;
    }

    /**
     * 匹配最末端捕获组
     *
     * @param text  匹配字符串
     * @param regex 正则表达式
     * @return 匹配结果
     */
    public static String matchLast(String text, String regex) {
        if (Objects.isNull(text)) {
            return "";
        }
        val list = matchAll(text, regex);
        return list.isEmpty() ? "" : list.get(list.size() - 1).trim();
    }
}
